/*
 * filozofowie.h
 *
 */

#ifndef FILOZOFOWIE_H_
#define FILOZOFOWIE_H_

#include <time.h>
#include <stdio.h>
#include <string.h>
#include "mpi.h"
#include <pthread.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>

#define MSGTAG 666
#define DELAY 4

#ifndef max
	#define max( a, b ) ( ((a) > (b)) ? (a) : (b) )
#endif

#ifndef min
	#define min( a, b ) ( ((a) < (b)) ? (a) : (b) )
#endif

int size; //liczba filozofów
int rank;

bool *waitingPhilosophers;
int *waitingPhilosophersRank;
int *waitingPhilosophersMessageID;
bool *waintingPhilosophersDeeper;
int reservedBottles;
int reservedCups;

int bottles;
int cups;
int chanceToDrink = 5;//przedział do 1 do 9, im więcej, tym mniejsza szansa na picie
int haveBottle;
int haveCup;
bool deeper = false;

bool randomState = true; //czy losować, czy filozof chce pić
bool want = false; //czy filozof chce pić
bool inside = false;//czy w sekcji krytycznej

int queueNo = 0; // numer procesu w kolejce
int logic_clock = 0; //zegar logiczny
int agreeCountCup = 0;
int agreeCountBottle = 0;
int requiredAgreementBottles;
int requiredAgreementCups;

void *receiver(); // obsluga wiadomosci przychodzacych
bool wantToTake();
void tryToDrink();
void allowToComeIn(int, int);
void receiveAgreement(int, int, int, int, int);
void giveWayToOther(int, int, int);
void sendToWaiting();
void criticalSection();
void sendRequest();
void giveBottle();
//bool randX = true;
#endif /* FILOZOFOWIE_H_ */
